package com.cje.doactivity;

import org.activiti.engine.*;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;

import java.util.List;
import java.util.zip.ZipInputStream;

/**
 * 流程定义的部署
 * activiti表有哪些？
 *   act_re_deployment  部署信息
 act_re_procdef     流程定义的一些信息
 act_ge_bytearray   流程定义的bpmn文件及png文件
 */

/**
 * 启动流程实例:
 *     前提是先已经完成流程定义的部署工作
 *
 *     背后影响的表：
 *       act_hi_actinst     已完成的活动信息
 act_hi_identitylink   参与者信息
 act_hi_procinst   流程实例
 act_hi_taskinst   任务实例
 act_ru_execution   执行表
 act_ru_identitylink   参与者信息
 act_ru_task  任务
 */

/**
 * 处理当前用户的任务
 * 背后操作的表：
 *   act_hi_actinst
 act_hi_identitylink
 act_hi_taskinst
 act_ru_identitylink
 act_ru_task
 */

/**
 * 删除已经部署的流程定义
 *
 * 背后影响的表:
 * act_ge_bytearray
 act_re_deployment
 act_re_procdef
 */
public class ActivitiCompleteTask {

    //发布流程定义
    @Test
    public void deploy(){
        //1.创建ProcessEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        //2.得到RepositoryService实例
        RepositoryService repositoryService = processEngine.getRepositoryService();

        //3.进行部署
        Deployment deployment = repositoryService.createDeployment()
                .addZipInputStream(new ZipInputStream(
                        this.getClass().getClassLoader().getResourceAsStream("diagram/holidayBPMN.zip")
                ))
               /* .addClasspathResource("diagram/holiday.bpmn")  //添加bpmn资源
                .addClasspathResource("diagram/holiday.png")*/
                .name("请假申请单流程")
                .deploy();

        //4.输出部署的一些信息
        System.out.println(deployment.getName());
        System.out.println(deployment.getId());
    }

    //创建一个流程实例
    @Test
    public void begin(){
        //1.得到ProcessEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        //2.得到RunService对象
        RuntimeService runtimeService = processEngine.getRuntimeService();

        //3.创建流程实例  流程定义的key需要知道 holiday
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("holiday");

        //4.输出实例的相关信息
        System.out.println("流程部署ID"+processInstance.getDeploymentId());//null
        System.out.println("流程定义ID"+processInstance.getProcessDefinitionId());//holiday:1:4
        System.out.println("流程实例ID"+processInstance.getId());//2501
        System.out.println("活动ID"+processInstance.getActivityId());//null
    }

    /**
     * @Author: ChenJinEn
     * @Date: 2020/8/22 18:24
     * @params: [args]
     * @return: void
     * @Description: //TODO 查询对应的负责人对应的任务并处理掉任务,至此流程走完结束
     */
    //zhangsan完成自己的任务
    @Test
    public void test01() {
        //1.得到ProcessEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        //2.得到TaskService对象
        TaskService taskService = processEngine.getTaskService();

        //3.查询当前用户的任务
        List<Task> list = taskService.createTaskQuery()
                .processDefinitionKey("holiday")
                .taskAssignee("zhangsan")
                .list();

        for (Task task : list) {
            //4.处理任务,结合当前用户任务列表的查询操作的话,任务ID:task.getId()
            taskService.complete(task.getId());
            //5.输出任务的id
            System.out.println(task.getId());
        }
    }


    //lishi完成自己的任务
    @Test
    public  void test02() {
        //1.得到ProcessEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        //2.得到TaskService对象
        TaskService taskService = processEngine.getTaskService();

        //3.查询当前用户的任务
        List<Task> list = taskService.createTaskQuery()
                .processDefinitionKey("holiday")
                .taskAssignee("lishi")
                .list();

        for (Task task : list) {
            //4.处理任务,结合当前用户任务列表的查询操作的话,任务ID:task.getId()
            taskService.complete(task.getId());
            //5.输出任务的id
            System.out.println(task.getId());
        }
    }

    //查询当前用户wangwu的任务并处理掉
    @Test
    public void test03() {
        //1.得到ProcessEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        //2.得到TaskService对象
        TaskService taskService = processEngine.getTaskService();

        //3.查询当前用户的任务
        List<Task> list = taskService.createTaskQuery()
                .processDefinitionKey("holiday")
                .taskAssignee("wangwu")
                .list();

        for (Task task : list) {
            //4.处理任务,结合当前用户任务列表的查询操作的话,任务ID:task.getId()
            taskService.complete(task.getId());
            //5.输出任务的id
            System.out.println(task.getId());
        }
    }




}
